package cn.tangsihai.hrm.mq.consumer;

import cn.tangsihai.hrm.mq.MQConsumer;
import cn.tangsihai.hrm.to.EmailTo;
import cn.tangsihai.hrm.to.MessageTo;
import cn.tangsihai.hrm.to.SMSTo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.List;

/**
 * 消费短信
 */
@Component
@Slf4j
public class CourseConsumer {
    /**
     * 消费RabbitMQ中的短信：
     *      1.拿到手机号
     *      2.发送短信--中网建
     *      3.保存发送记录到发送记录表
     *      4.签收消息
     */
    @RabbitListener(queues = MQConsumer.QUEUE_NAME_SMS, containerFactory = "rabbitListenerContainerFactory")
    public void smsConsumer(@Payload SMSTo smsTo, Channel channel, Message message){
        // 1.拿到手机号
        List<String> phones = smsTo.getPhones();

        // 2.发送短信--中网建
        //TODO 请真正发送
        String phone = StringUtils.join(phones, ",");
        log.info("批量发送短信：{} -- {}", phone, smsTo.getContent());

        // 3.保存发送记录到发送记录表
        // TODO 保存发送记录

        // 4.签收消息
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 消费mq中的邮件：
     *      1.拿到邮箱
     *      2.发送邮件
     *      3.保存发送记录到数据库
     *      4.签收消息
     */
    @RabbitListener(queues = MQConsumer.QUEUE_NAME_EMAIL, containerFactory = "rabbitListenerContainerFactory")
    public void emailConsumer(@Payload EmailTo emailTo, Channel channel, Message message){
        // 1.拿到邮箱
        List<String> emails = emailTo.getEmails();

        // 2.发送邮件
        //TODO 请真正发送
        emails.forEach(email->{
            log.info("邮件发送：{}--{}", email, emailTo.getContent());

            // 3.保存发送记录到数据库
            //TODO 保存发送记录
        });

        // 4.签收消息
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 消费mq中的站内信：
     *      1.拿到需要发送消息的用户id
     *      2.遍历id发送消息
     *      3.保存发送记录到数据库
     *      4.签收消息
     */
    @RabbitListener(queues = MQConsumer.QUEUE_NAME_MESSAGE, containerFactory = "rabbitListenerContainerFactory")
    public void messageConsumer(@Payload MessageTo messageTo, Channel channel, Message message){
        // 1.拿到需要发送消息的用户id
        List<Long> ids = messageTo.getIds();

        // 2.遍历id发送消息
        //TODO 请真正发送
        ids.forEach(id->{
            log.info("站内信发送：{}---{}", id, messageTo.getContent());

            // 3.保存发送记录到数据库
            //TODO 保存发送记录
        });
        // 4.签收消息
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
